package br.ucb.cesbdao.persistencia.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;

import br.ucb.cesbdao.beans.TipoAtendimento;
import br.ucb.cesbdao.persistencia.AbstractConnectionDAO;
import br.ucb.cesbdao.persistencia.factory.FactoryConnection;

public class TipoAtendimentoDAO extends AbstractConnectionDAO{
	
	public TipoAtendimentoDAO(Connection conexao) {
		super(conexao);
	}
	
	public  void addAtendimento(TipoAtendimento atendimento) throws ClassNotFoundException, SQLException{	
		PreparedStatement stm = getConexao().prepareStatement(sqlAdd);
		stm.setString(1, atendimento.getDescricao());
		stm.execute();
		FactoryConnection.getInstance().closeConexao(stm);
	}
	public  void addAtendimento(String descricao) throws ClassNotFoundException, SQLException{	
		PreparedStatement stm = getConexao().prepareStatement(sqlAdd);
		stm.setString(1,descricao);
		stm.execute();
		FactoryConnection.getInstance().closeConexao(stm);
	}
	public  void delAtendimento(int id) throws ClassNotFoundException, SQLException{ 
		PreparedStatement stm = getConexao().prepareStatement(sqlDel);
		stm.setInt(1,id);
		stm.execute();
		FactoryConnection.getInstance().closeConexao(stm);
	}
	public  TipoAtendimento getByIdTipoAtendimento(int id) throws SQLException, ClassNotFoundException{
		TipoAtendimento tipoatendimento = new TipoAtendimento();
		PreparedStatement stm = getConexao().prepareStatement(sqlByIdEncaminhamento);
		stm.setInt(1, id);
		ResultSet rs = stm.executeQuery();
		if(rs.next()){
			tipoatendimento = preencheTipoAtendimento(rs);
		}
		FactoryConnection.getInstance().closeConexao(stm, rs);
		return tipoatendimento;
	}
	public  ArrayList<TipoAtendimento> getAll() throws ClassNotFoundException, SQLException{
		TipoAtendimento tipoatendimento = new TipoAtendimento();
		ArrayList<TipoAtendimento> tipoatendimentos = new ArrayList<TipoAtendimento>();
		PreparedStatement stm = getConexao().prepareStatement(sqlAll);
		ResultSet rs = stm.executeQuery();
		while(rs.next()){
			tipoatendimento = preencheTipoAtendimento(rs);
			tipoatendimentos.add(tipoatendimento);
		}
		FactoryConnection.getInstance().closeConexao(stm, rs);
		return tipoatendimentos;

	}
	private  TipoAtendimento preencheTipoAtendimento(ResultSet rs) throws SQLException {
		return new TipoAtendimento(rs.getInt(1),rs.getString(2));
	}

	public  ArrayList<TipoAtendimento> getByIdAtendimento(int idAtendimento) throws SQLException, ClassNotFoundException {
		PreparedStatement stm = getConexao().prepareStatement(sqlByIdAtendimento);
		stm.setInt(1, idAtendimento);
		ResultSet rs = stm.executeQuery();
		ArrayList<TipoAtendimento> tipoatendimentos = new ArrayList<TipoAtendimento>();
		while(rs.next()){
			tipoatendimentos.add(preencheTipoAtendimento(rs));
		}
		if(tipoatendimentos.isEmpty())
			tipoatendimentos.add(new TipoAtendimento(0,"-"));
		return tipoatendimentos;

	}
	public  ArrayList<TipoAtendimento> getByNotInIdAtendimento(int idAtendimento) throws SQLException, ClassNotFoundException {
		PreparedStatement stm = getConexao().prepareStatement(sqlNotInAtendimento);
		stm.setInt(1, idAtendimento);
		ResultSet rs = stm.executeQuery();
		ArrayList<TipoAtendimento> tipoatendimentos = new ArrayList<TipoAtendimento>();
		while(rs.next()){
			tipoatendimentos.add(preencheTipoAtendimento(rs));
		}
		FactoryConnection.getInstance().closeConexao(stm, rs);
		return tipoatendimentos;

	}
	public  void upAtendimento(String descricao, int idTipoAtende) throws ClassNotFoundException, SQLException {
		PreparedStatement stm = getConexao().prepareStatement(sqlUpDescricao);
		stm.setString(1,descricao);
		stm.setInt(2, idTipoAtende);
		stm.executeUpdate();
		FactoryConnection.getInstance().closeConexao(stm);
		
	}
	public  ArrayList<TipoAtendimento> getByDescricao(String descricao) throws ClassNotFoundException, SQLException {
		TipoAtendimento tipoatendimento = new TipoAtendimento();
		String sqlByDescricao = "SELECT *FROM daotipoatendimento WHERE descricao LIKE '%"+descricao+"%';";
		ArrayList<TipoAtendimento> tipoatendimentos = new ArrayList<TipoAtendimento>();
		PreparedStatement stm = getConexao().prepareStatement(sqlByDescricao);
		ResultSet rs = stm.executeQuery();
		while(rs.next()){
			tipoatendimento = preencheTipoAtendimento(rs);
			tipoatendimentos.add(tipoatendimento);
		}
		FactoryConnection.getInstance().closeConexao(stm, rs);
		return tipoatendimentos;
	}

	
	private static final String sqlAdd = "INSERT INTO daotipoatendimento VALUES(null,?);";
	private static final String sqlDel = "DELETE FROM daotipoatendimento WHERE idTipoAtende = ?;";
	private static final String sqlByIdEncaminhamento = "SELECT *FROM daotipoatendimento WHERE idTipoAtende = ?;";
	private static final String sqlByIdAtendimento = "Select *from daoTipoAtendimento T, daoAtende_tipoAtende AT, daoAtendimento A WHERE T.idTipoAtende = AT.idTipoAtende and At.idAtendimento = A.idAtendimento and A.idAtendimento = ?;";
	private static final String sqlAll = "SELECT *FROM daotipoatendimento;";
	private static final String sqlUpDescricao = "UPDATE daotipoatendimento SET descricao = ? WHERE idTipoAtende = ?;";
	
	
	private static final String sqlNotInAtendimento = "select * from "+
														"daoTipoAtendimento T "+
														"where " + 
														"T.idTipoAtende " +
														"not in ( " +
														"Select T.idTipoAtende from " + 
														"daoTipoAtendimento T, " +
														"daoAtende_tipoAtende AT, " + 
														"daoAtendimento A " +
														"WHERE "+ 
														"T.idTipoAtende = AT.idTipoAtende and "+ 
														"At.idAtendimento = A.idAtendimento and "+ 
														"A.idAtendimento = ? "+
														");";
}
